// 实现用户管理子服务的服务器
#include "user_server.hpp"

DEFINE_bool(run_mode, false, "程序的运行模式，false-调试； true-发布；");
DEFINE_string(log_file, "", "发布模式下，用于指定日志的输出文件");
DEFINE_int32(log_level, 0, "发布模式下，用于指定日志输出等级");

// 命令行解析获取服务注册的参数
DEFINE_string(registry_host, "http://127.0.0.1:2379", "服务注册中心地址");
DEFINE_string(base_service, "/service", "服务监控根目录");
DEFINE_string(instance_name, "/user_service/instance", "当前实例名称");
DEFINE_string(access_host, "127.0.0.1:10003", "当前实例的外部访问地址");

// 关心的服务名称
DEFINE_string(care_service, "/service/file_service", "服务名称");

// 命令行解析获取RPC的参数
DEFINE_int32(rpc_listen_port, 10003, "Rpc服务器监听端口");
DEFINE_int32(rpc_timeout, -1, "Rpc调用超时时间");
DEFINE_int32(rpc_threads, 1, "Rpc的IO线程数量");

// es的参数
DEFINE_string(es_host, "http://127.0.0.1:9200/", "es搜索引擎url");

// mysql的参数
DEFINE_string(mysql_user_name, "root", "MySQL用户名称");
DEFINE_string(mysql_password, "Czh432248", "MySQL用户密码");
DEFINE_string(mysql_db_name, "ChatRoom", "MySQL数据库默认库名称");
DEFINE_string(mysql_host, "127.0.0.1", "这是MySQL服务器地址");
DEFINE_int32(mysql_port, 0, "这是MySQL服务器端口");
DEFINE_string(mysql_cest, "utf8", "MySQL客户端字符集");
DEFINE_int32(mysql_max_num, 4, "MySQL连接池最大连接数量");

// redis的参数
DEFINE_string(redis_host, "127.0.0.1", "这是服务器的监听地址，格式为[0.0.0.0]");
DEFINE_int32(redis_port, 6379, "这是redis服务器的监听端口，格式为[6379]");
DEFINE_bool(redis_keep_alive, true, "是否启用长连接保活，格式为[true/false]");
DEFINE_int32(redis_db_flag, 0, "库的编号，默认为0");

// dms短信发送
DEFINE_string(access_key_id, "LTAI5t7bsYuKhwRDFQD8J7So", "DMS短信发送秘钥id");
DEFINE_string(access_key_secret, "icDRjPFgcnaMlGSZMmqEkzkGbB54TS", "DMS短信发送秘钥");

int main(int argc, char *argv[])
{
    google::ParseCommandLineFlags(&argc, &argv, true);
    bite_im::initLogger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);

    bite_im::UserServerBuilder usb;
    // 获取es客户端
    std::vector<std::string> es_host_list = {FLAGS_es_host};
    usb.make_es_object(es_host_list);
    // 获取redis客户端
    usb.make_redis_object(FLAGS_redis_host, FLAGS_redis_port, FLAGS_redis_keep_alive, FLAGS_redis_db_flag);
    // 获取mysql客户端
    usb.make_mysql_object(FLAGS_mysql_user_name, FLAGS_mysql_password, FLAGS_mysql_db_name,
                          FLAGS_mysql_host, FLAGS_mysql_port, FLAGS_mysql_cest, FLAGS_mysql_max_num);
    // 获取短信验证码对象
    usb.make_dms_object(FLAGS_access_key_id, FLAGS_access_key_secret);
    // 获取查找模块
    usb.make_find_object(FLAGS_registry_host, FLAGS_base_service, FLAGS_care_service);
    // 搭建rpc  注意rpc要在查找模块之后
    usb.make_rpc_server(FLAGS_rpc_listen_port, FLAGS_rpc_timeout, FLAGS_rpc_threads);
    // 获取注册模块
    usb.make_reg_object(FLAGS_registry_host, FLAGS_base_service + FLAGS_instance_name, FLAGS_access_host);

    auto server = usb.build();
    server->start();
    return 0;
}